home *** CD-ROM | disk | FTP | other *** search
/ Day Cry / Day Cry CD.bin / oh_towns / tetujin / src.lzh / G_EFF / SOFT.C < prev    next >
Text File  |  1994-08-27  |  2KB  |  116 lines

  1. /*
  2.         graphic effect lib.
  3.           Soft
  4.  
  5.         h. Toda 1994 8 22
  6. */
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <egb.h>
  11. #include "g_eff.h"
  12.  
  13. #define NOERR 0        /* no error */
  14.  
  15. static int mx ;
  16. static int aSen ;
  17. static int mSen ;
  18. static int cMax ;
  19. static int aMax ;
  20. static int x1 ;
  21. static int y1 ;
  22. static int x2 ;
  23. static int y2 ;
  24. static int (*read1)() ;
  25. static int (*write)() ;
  26. static int (*mask)() ;
  27.  
  28. g_softnessFilter( BASICPARA *para, int rate )
  29. {
  30.     unsigned char a[10][4] ;
  31.     int i, x, y ;
  32.     int n ;
  33.     int k1, k2 ;
  34.  
  35.     mx = para->mix ;
  36.     aSen = para->alphaSen ;
  37.     mSen = para->maskSen ;
  38.     cMax = para->colorMax ;
  39.     aMax = para->alphaMax ;
  40.     x1 = para->lupx ;
  41.     y1 = para->lupy ;
  42.     x2 = para->rdwx ;
  43.     y2 = para->rdwy ;
  44.     read1 = para->read1 ;
  45.     write = para->write ;
  46.     mask = para->mask ;
  47.  
  48.     k1 = rate >> 3 ;
  49.     k2 = 256 - k1*8 ;
  50.  
  51.     for( y = y1 ; y <= y2 ; y++ )
  52.     {
  53.         for( x=x1 ; x <= x2 ; x++ )
  54.         {
  55.             read1( x-1, y-1, a[0] ) ;
  56.             read1( x,   y-1, a[1] ) ;
  57.             read1( x+1, y-1, a[2] ) ;
  58.             read1( x-1, y,   a[3] ) ;
  59.             read1( x,   y,   a[4] ) ;
  60.             read1( x+1, y,   a[5] ) ;
  61.             read1( x-1, y+1, a[6] ) ;
  62.             read1( x,   y+1, a[7] ) ;
  63.             read1( x+1, y+1, a[8] ) ;
  64.  
  65.             for( i=0 ; i<3 ; i++ )
  66.             {
  67.                 int total ;
  68.  
  69.                 total = k1*( (int)(a[0][i]) + a[1][i] + a[2][i] +
  70.                                    a[3][i]            + a[5][i] +
  71.                                    a[6][i]  + a[7][i] + a[8][i]
  72.                            ) +
  73.                         k2*( (int)(a[4][i]) ) ;
  74.                 total = (total + 128) >> 8 ;
  75.                 if( total < 0 )total = 0 ;
  76.                 if( total > 255 )total = 255 ;
  77.                 a[9][i] = total ;
  78.             }
  79.             mixWrite( x, y, a[9], a[4] ) ;
  80.         }
  81.     }
  82.  
  83.     return NOERR ;
  84. }
  85.  
  86. static mixWrite( int x, int y, unsigned char *a, unsigned char *b )
  87. {
  88.     unsigned char c[4] ;
  89.     int mix ;
  90.  
  91.     if( mSen )
  92.     {
  93.         if( mask( x, y ) >= mSen )
  94.             return NOERR ;
  95.     }
  96.  
  97.     mix = mx ;
  98.     if( aSen )
  99.     {
  100.         mix = mix * b[3] / aMax ;
  101.     }
  102.  
  103.     c[0] = ( a[0] * mix + b[0] * ( 256 - mix ) + 0x80 ) >> 8 ;
  104.     c[1] = ( a[1] * mix + b[1] * ( 256 - mix ) + 0x80 ) >> 8 ;
  105.     c[2] = ( a[2] * mix + b[2] * ( 256 - mix ) + 0x80 ) >> 8 ;
  106.     c[3] = b[3] ;
  107.  
  108.     if( mix )
  109.     {
  110.         write( x, y, c ) ;
  111.     }
  112.  
  113.     return NOERR ;
  114. }
  115.  
  116.